home *** CD-ROM | disk | FTP | other *** search
/ Programming Windows (5th Edition) / Programming Windows, 5th ed. - Companion CD (097-0002183)(1999).iso / Chap15 / DibSect / DibSect.c next >
Encoding:
C/C++ Source or Header  |  1998-10-09  |  7.0 KB  |  234 lines

  1. /*--------------------------------------------------------
  2.    DIBSECT.C -- Displays a DIB Section in the client area
  3.                 (c) Charles Petzold, 1998
  4.   --------------------------------------------------------*/
  5.  
  6. #include <windows.h>
  7. #include <commdlg.h>
  8. #include "resource.h"
  9.  
  10. LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
  11.  
  12. TCHAR szAppName[] = TEXT ("DibSect") ;
  13.  
  14. int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
  15.                     PSTR szCmdLine, int iCmdShow)
  16. {
  17.      HWND     hwnd ;
  18.      MSG      msg ;
  19.      WNDCLASS wndclass ;
  20.  
  21.      wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
  22.      wndclass.lpfnWndProc   = WndProc ;
  23.      wndclass.cbClsExtra    = 0 ;
  24.      wndclass.cbWndExtra    = 0 ;
  25.      wndclass.hInstance     = hInstance ;
  26.      wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
  27.      wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
  28.      wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
  29.      wndclass.lpszMenuName  = szAppName ;
  30.      wndclass.lpszClassName = szAppName ;
  31.  
  32.      if (!RegisterClass (&wndclass))
  33.      {
  34.           MessageBox (NULL, TEXT ("This program requires Windows NT!"), 
  35.                       szAppName, MB_ICONERROR) ;
  36.           return 0 ;
  37.      }
  38.  
  39.      hwnd = CreateWindow (szAppName, TEXT ("DIB Section Display"),
  40.                           WS_OVERLAPPEDWINDOW,
  41.                           CW_USEDEFAULT, CW_USEDEFAULT,
  42.                           CW_USEDEFAULT, CW_USEDEFAULT, 
  43.                           NULL, NULL, hInstance, NULL) ;
  44.  
  45.      ShowWindow (hwnd, iCmdShow) ;
  46.      UpdateWindow (hwnd) ;
  47.  
  48.      while (GetMessage (&msg, NULL, 0, 0))
  49.      {
  50.           TranslateMessage (&msg) ;
  51.           DispatchMessage (&msg) ;
  52.  
  53.      }
  54.      return msg.wParam ;
  55. }
  56.  
  57. HBITMAP CreateDibSectionFromDibFile (PTSTR szFileName)
  58. {
  59.      BITMAPFILEHEADER bmfh ;
  60.      BITMAPINFO     * pbmi ;
  61.      BYTE           * pBits ;
  62.      BOOL             bSuccess ;
  63.      DWORD            dwInfoSize, dwBytesRead ;
  64.      HANDLE           hFile ;
  65.      HBITMAP          hBitmap ;
  66.  
  67.           // Open the file: read access, prohibit write access
  68.  
  69.      hFile = CreateFile (szFileName, GENERIC_READ, FILE_SHARE_READ,
  70.                          NULL, OPEN_EXISTING, 0, NULL) ;
  71.  
  72.      if (hFile == INVALID_HANDLE_VALUE)
  73.           return NULL ;
  74.  
  75.           // Read in the BITMAPFILEHEADER
  76.  
  77.      bSuccess = ReadFile (hFile, &bmfh, sizeof (BITMAPFILEHEADER), 
  78.                           &dwBytesRead, NULL) ;
  79.  
  80.      if (!bSuccess || (dwBytesRead != sizeof (BITMAPFILEHEADER))         
  81.                    || (bmfh.bfType != * (WORD *) "BM"))
  82.      {
  83.           CloseHandle (hFile) ;
  84.           return NULL ;
  85.      }
  86.  
  87.           // Allocate memory for the BITMAPINFO structure & read it in
  88.  
  89.      dwInfoSize = bmfh.bfOffBits - sizeof (BITMAPFILEHEADER) ;
  90.  
  91.      pbmi = malloc (dwInfoSize) ;
  92.  
  93.      bSuccess = ReadFile (hFile, pbmi, dwInfoSize, &dwBytesRead, NULL) ;
  94.  
  95.      if (!bSuccess || (dwBytesRead != dwInfoSize))
  96.      {
  97.           free (pbmi) ;
  98.           CloseHandle (hFile) ;
  99.           return NULL ;
  100.      }
  101.  
  102.           // Create the DIB Section
  103.  
  104.      hBitmap = CreateDIBSection (NULL, pbmi, DIB_RGB_COLORS, &pBits, NULL, 0) ;
  105.  
  106.      if (hBitmap == NULL)
  107.      {
  108.           free (pbmi) ;
  109.           CloseHandle (hFile) ;
  110.           return NULL ;
  111.      }
  112.  
  113.           // Read in the bitmap bits
  114.  
  115.      ReadFile (hFile, pBits, bmfh.bfSize - bmfh.bfOffBits, &dwBytesRead, NULL) ;
  116.  
  117.      free (pbmi) ;
  118.      CloseHandle (hFile) ;
  119.  
  120.      return hBitmap ;
  121. }
  122.  
  123. LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  124. {
  125.      static HBITMAP      hBitmap ;
  126.      static int          cxClient, cyClient ;
  127.      static OPENFILENAME ofn ;
  128.      static TCHAR        szFileName [MAX_PATH], szTitleName [MAX_PATH] ;
  129.      static TCHAR        szFilter[] = TEXT ("Bitmap Files (*.BMP)\0*.bmp\0")
  130.                                       TEXT ("All Files (*.*)\0*.*\0\0") ;
  131.      BITMAP              bitmap ;
  132.      HDC                 hdc, hdcMem ;
  133.      PAINTSTRUCT         ps ;
  134.  
  135.      switch (message)
  136.      {
  137.      case WM_CREATE:
  138.           ofn.lStructSize       = sizeof (OPENFILENAME) ;
  139.           ofn.hwndOwner         = hwnd ;
  140.           ofn.hInstance         = NULL ;
  141.           ofn.lpstrFilter       = szFilter ;
  142.           ofn.lpstrCustomFilter = NULL ;
  143.           ofn.nMaxCustFilter    = 0 ;
  144.           ofn.nFilterIndex      = 0 ;
  145.           ofn.lpstrFile         = szFileName ;
  146.           ofn.nMaxFile          = MAX_PATH ;
  147.           ofn.lpstrFileTitle    = szTitleName ;
  148.           ofn.nMaxFileTitle     = MAX_PATH ;
  149.           ofn.lpstrInitialDir   = NULL ;
  150.           ofn.lpstrTitle        = NULL ;
  151.           ofn.Flags             = 0 ;
  152.           ofn.nFileOffset       = 0 ;
  153.           ofn.nFileExtension    = 0 ;
  154.           ofn.lpstrDefExt       = TEXT ("bmp") ;
  155.           ofn.lCustData         = 0 ;
  156.           ofn.lpfnHook          = NULL ;
  157.           ofn.lpTemplateName    = NULL ;
  158.  
  159.           return 0 ;
  160.  
  161.      case WM_SIZE:
  162.           cxClient = LOWORD (lParam) ;
  163.           cyClient = HIWORD (lParam) ;
  164.           return 0 ;
  165.  
  166.      case WM_COMMAND:
  167.           switch (LOWORD (wParam))
  168.           {
  169.           case IDM_FILE_OPEN:
  170.  
  171.                     // Show the File Open dialog box
  172.  
  173.                if (!GetOpenFileName (&ofn))
  174.                     return 0 ;
  175.                
  176.                     // If there's an existing bitmap, delete it
  177.  
  178.                if (hBitmap)
  179.                {
  180.                     DeleteObject (hBitmap) ;
  181.                     hBitmap = NULL ;
  182.                }
  183.                     // Create the DIB Section from the DIB file
  184.  
  185.                SetCursor (LoadCursor (NULL, IDC_WAIT)) ;
  186.                ShowCursor (TRUE) ;
  187.  
  188.                hBitmap = CreateDibSectionFromDibFile (szFileName) ;
  189.  
  190.                ShowCursor (FALSE) ;
  191.                SetCursor (LoadCursor (NULL, IDC_ARROW)) ;
  192.  
  193.                     // Invalidate the client area for later update
  194.  
  195.                InvalidateRect (hwnd, NULL, TRUE) ;
  196.  
  197.                if (hBitmap == NULL)
  198.                {
  199.                     MessageBox (hwnd, TEXT ("Cannot load DIB file"), 
  200.                                 szAppName, MB_OK | MB_ICONEXCLAMATION) ;
  201.                }
  202.                return 0 ;
  203.           }
  204.           break ;
  205.  
  206.      case WM_PAINT:
  207.           hdc = BeginPaint (hwnd, &ps) ;
  208.  
  209.           if (hBitmap)
  210.           {
  211.                GetObject (hBitmap, sizeof (BITMAP), &bitmap) ;
  212.  
  213.                hdcMem = CreateCompatibleDC (hdc) ;
  214.                SelectObject (hdcMem, hBitmap) ;
  215.  
  216.                BitBlt (hdc,    0, 0, bitmap.bmWidth, bitmap.bmHeight, 
  217.                        hdcMem, 0, 0, SRCCOPY) ;
  218.  
  219.                DeleteDC (hdcMem) ;
  220.           }
  221.  
  222.           EndPaint (hwnd, &ps) ;
  223.           return 0 ;
  224.           
  225.      case WM_DESTROY:
  226.           if (hBitmap)
  227.                DeleteObject (hBitmap) ;
  228.  
  229.           PostQuitMessage (0) ;
  230.           return 0 ;
  231.      }
  232.      return DefWindowProc (hwnd, message, wParam, lParam) ;
  233. }
  234.